package org.linuxsogood.boot.lock;

import java.util.concurrent.*;

/**
 * @author honway.liu
 * @date 2019-07-31 18:57
 * @email gm100861@gmail.com
 * @blog http://linuxsogood.org
 * CyclicBarrier
 * 计数器可以重置,使用多次
 * 多个线程之间相互等待,只有多个线程全部就绪(计数器变为0)之后才能继续执行
 *
 * CountDownLatch
 * 计数器只能使用一次
 * 实现一个或多个线程等待其它线程完成之后(计数器为0)才可以继续执行
 */
public class CyclicBarrierExample {

    private static CyclicBarrier barrier = new CyclicBarrier(5);

    public static void main(String[] args) throws InterruptedException {
        ExecutorService executorService = Executors.newCachedThreadPool();

        for (int i = 0; i < 10; i++) {
            TimeUnit.SECONDS.sleep(1);
            executorService.execute(() -> {
                try {
                    race();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            });

        }
    }

    private static void race() throws InterruptedException, BrokenBarrierException {
        TimeUnit.SECONDS.sleep(1);
        System.out.println(Thread.currentThread().getName()+" is ready...");
        barrier.await();
        // 下面的代码,只有当barrier中的计数器为0的时候,才能继续执行
        // 每次调用await,barrier中的计数器都会减1
        System.out.println(Thread.currentThread().getName()+" continue...");
    }
}
